package day16;

import java.util.ArrayList;
import java.util.List;

//猫的观察者的抽象类
public abstract class AbstractCat {
    String name;
    //用于接受猫状态改变的通知
    public abstract void update(String msg);
}
//观察者（主人类），用于观察猫
class Person extends AbstractCat{
    public Person(String name){
        super.name=name;
    }
    @Override
    public void update(String msg) {
        System.out.println(name+"观察者接收到了通知"+msg);
    }
}

//被观察着  猫主题
interface CatTopic{
    void add(AbstractCat user);//添加关注
    void remove(AbstractCat user); //取消关注
    void update(String msg); //状态改变的通知（会通知所有关注的人）

}
//定义猫对象
class Cat implements CatTopic{
    private List<AbstractCat> list=new ArrayList<>();
    @Override
    public void add(AbstractCat user) {
        list.add(user);
        System.out.println(user.name+"添加关注！");
    }

    @Override
    public void remove(AbstractCat user) {
        list.remove(user);
        System.out.println(user.name+"取消关注！");
    }

    @Override
    public void update(String msg) {
         System.out.println("猫咪状态发生了改变："+msg);
         for (AbstractCat c:list){
             c.update(msg);
         }
    }

    public static void main(String[] args) {
        //定义一个猫对象
        Cat c=new Cat();
        AbstractCat user1=new Person("万鑫");
        AbstractCat user2=new Person("广志");
        AbstractCat user3=new Person("志广");
        c.add(user1);
        c.add(user2);
        c.add(user3);
        //更新状态  所有关注的人都会收到通知
        c.update("吃饭了");
        //取消关注
        c.remove(user2);
        //再次更新
        c.update("睡觉了");
    }
}